////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2017 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  camxbpsawbbgstats14.h
/// @brief AWB BG Stats14 class declarations
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef CAMXBPSAWBBGSTATS14_H
#define CAMXBPSAWBBGSTATS14_H

#include "camxispstatsmodule.h"

CAMX_NAMESPACE_BEGIN

// Register range from the SWI/HPG
static const UINT32 BPSAWBBGStats14RegionMinWidth  = 6;     ///< Minimum AWB BG stats region width that we could configure
static const UINT32 BPSAWBBGStats14RegionMaxWidth  = 390;   ///< Maximum AWB BG stats region width that we could configure
static const UINT32 BPSAWBBGStats14RegionMinHeight = 2;     ///< Minimum AWB BG stats region Height that we could configure
static const UINT32 BPSAWBBGStats14RegionMaxHeight = 512;   ///< Maximum AWB BG stats region Height that we could configure

static const UINT32 BPSAWBBGStats14MaxHorizontalRegions = 160;   ///< Maximum AWB BG stats horizontal region
static const UINT32 BPSAWBBGStats14MaxVerticalRegions   = 90;   ///< Maximum AWB BG stats vertical region

static const UINT32 AWBBGStats14MaxChannelThreshold = (1 << BPSPipelineBitWidth) - 1;   ///< Max AWB BG stats channel threshold

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief AWB BG Stats14 Class Implementation
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class BPSAWBBGStats14 final : public ISPStatsModule
{
public:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Create
    ///
    /// @brief  Create BPSAWBBGStats14 Object
    ///
    /// @param  pCreateData Pointer to the BPSAWBBGStats14 Creation
    ///
    /// @return CamxResultSuccess if successful.
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static CamxResult Create(
        BPSStatsModuleCreateData* pCreateData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Execute
    ///
    /// @brief  Execute process capture request to configure module
    ///
    /// @param  pInputData Pointer to the ISP input data
    ///
    /// @return CamxResultSuccess if successful.
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual CamxResult Execute(
        ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ~BPSAWBBGStats14
    ///
    /// @brief  Destructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual ~BPSAWBBGStats14();

protected:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// BPSAWBBGStats14
    ///
    /// @brief  Constructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    BPSAWBBGStats14();

private:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ValidateDependenceParams
    ///
    /// @brief  Validate the stats region of interest configuration from stats module
    ///
    /// @param  pInputData Pointer to the ISP input data
    ///
    /// @return CamxResult Indicates if the input is valid or invalid
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CamxResult ValidateDependenceParams(
        ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// CheckDependenceChange
    ///
    /// @brief  Check to see if the Dependence Trigger Data Changed
    ///
    /// @param  pInputData Pointer to the ISP input data
    ///
    /// @return BOOL
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    BOOL CheckDependenceChange(
        ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// AdjustROIParams
    ///
    /// @brief  Adjust ROI from stats to requirement based on hardware
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    VOID AdjustROIParams();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// UpdateBPSInternalData
    ///
    /// @brief  Update IFE internal data
    ///
    /// @param  pInputData Pointer to the ISP input data
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    VOID UpdateBPSInternalData(
        ISPInputData * pInputData);

    BPSAWBBGStats14(const BPSAWBBGStats14&)            = delete;    ///< Disallow the copy constructor
    BPSAWBBGStats14& operator=(const BPSAWBBGStats14&) = delete;    ///< Disallow assignment operator

    BGBEConfig  m_AWBBGConfig;  ///< AWBBG configuration data from stats
    UINT32      m_regionWidth;  ///< AWB individual region width
    UINT32      m_regionHeight; ///< AWB individual region height
    BOOL        m_isAdjusted;   ///< Flag to indicate if ROI from stats was modified
};

CAMX_NAMESPACE_END

#endif // CAMXBPSAWBBGSTATS14_H
